Још неки примери¶
Нудимо вам и пар додатних примера који могу да буду интересантни за проучавање, играње, или као полазне идеје за ваше пројекте.
У овој лекцији неће бити нових ствари које треба научити, али то (наравно) не значи да смо научили све. Као што и наслов приручника каже, све што смо до сада прешли треба посматрати као увод и основу за даље стицање знања и вештина.
Палачинке¶
На левој страни се налазе правоугаоници различите величине, један на другом. Кликом на дугме >
пребацујемо највиши правоугаоник на врх десне гомиле (која је на почетку празна). Кликом на дугме <<
пребацујемо целу десну гомилу на врх леве стране. Циљ је да се на левој страни појаве правоугаоници сложени по величини (највећи доле, најмањи горе).
![../_images/interact_pancakes.gif](https://petljamediastorage.blob.core.windows.net/root/Media/Default/Kursevi/Srednja/cs/interact_pancakes.gif)
Користићемо два оквира за слику, један прислоњен уз леву, а други уз десну ивицу прозора. У средњем делу прозора поставћемо четири дугмета. Два од њих су описана у поставци задатка и потребна су за само играње игре, а остала два дугмета ће служити за ресетовање текуће игре (играње од почетка), односно за почињање нове игре. Изнад дугмади пстављамо лабелу која показује број одиграних потеза, а испод дугмади лабелу која приказује поруку честитања после успешно одигране игре.
Овај пример је посебан по томе што у њему нисмо обрађивали догађаје миша или тастатуре, корисник игра игру само кликовима на дугмад. Такође, ово нам је једини пример у коме користимо два ковира за слику. Тиме смо постигли да помоћу исте функције (NacrtajPalacinke) цртамо правоугаонике и на једној и на другој страни. Избегавањем редунданце (понављања делова програма) код постаје лакши за одржавање. То значи да је олакшано мењање програма, било да је реч о исправљању грешака, или уграђивању нових идеја, односно захтева.
Иако је програм релативно дугачак, свака од функција је довољно кратка и једноставна да више не би требало да вам буде проблем да их разумете и без објашњења.
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace Palacinke
{
public partial class Form1 : Form
{
const int BrojPalacinki = 10;
List<int> PocetnaLista = new List<int>();
List<int> LevaLista = new List<int>();
List<int> DesnaLista = new List<int>();
int BrojKlikova = 0;
Random Rnd = new Random();
public Form1()
{
InitializeComponent();
Text = "Palačinke";
BackColor = Color.FromArgb(23, 187, 156);
pictureBox1.BackColor = Color.FromArgb(23, 187, 156);
pictureBox2.BackColor = Color.FromArgb(23, 187, 156);
btnJednuDesno.Enabled = false;
btnSveLevo.Enabled = false;
btnIspocetka.Enabled = false;
}
private void NacrtajPalacinke(PictureBox pb, List<int> palacinke, PaintEventArgs e)
{
int d = 16;
int y = pb.Height - 3 * d;
Graphics g = e.Graphics;
Brush cetka = new SolidBrush(Color.Yellow);
foreach (int n in palacinke)
{
int x = (pb.Width - n * d) / 2;
g.FillRectangle(cetka, x, y, n * d, d);
y -= d;
}
}
private void btnNova_Click(object sender, EventArgs e)
{
PocetnaLista.Clear();
LevaLista.Clear();
DesnaLista.Clear();
for (int i = 0; i < BrojPalacinki; i++)
PocetnaLista.Add(i + 1);
PocetnaLista = PocetnaLista.OrderBy(a => Rnd.Next()).ToList(); // Promesaj
LevaLista.AddRange(PocetnaLista);
btnJednuDesno.Enabled = true;
btnSveLevo.Enabled = true;
btnIspocetka.Enabled = true;
BrojKlikova = 0;
lblBrojKlikova.Text = BrojKlikova.ToString();
lblCestitka.Text = "";
Invalidate();
}
private void btnIspocetka_Click(object sender, EventArgs e)
{
LevaLista.Clear();
DesnaLista.Clear();
LevaLista.AddRange(PocetnaLista);
btnJednuDesno.Enabled = true;
btnSveLevo.Enabled = true;
BrojKlikova = 0;
lblBrojKlikova.Text = BrojKlikova.ToString();
lblCestitka.Text = "";
Invalidate();
}
private void btnJednuDesno_Click(object sender, EventArgs e)
{
if (LevaLista.Count > 0)
{
BrojKlikova++;
lblBrojKlikova.Text = BrojKlikova.ToString();
DesnaLista.Add(LevaLista.Last());
LevaLista.RemoveAt(LevaLista.Count - 1);
Invalidate();
}
}
private void btnSveLevo_Click(object sender, EventArgs e)
{
if (DesnaLista.Count > 0)
{
BrojKlikova++;
lblBrojKlikova.Text = BrojKlikova.ToString();
LevaLista.AddRange(DesnaLista);
DesnaLista.Clear();
bool opadajuci = true;
for (int i = 1; i < LevaLista.Count; i++)
{
if (LevaLista[i] > LevaLista[i - 1])
{
opadajuci = false;
break;
}
}
if (opadajuci)
{
btnJednuDesno.Enabled = false;
btnSveLevo.Enabled = false;
lblCestitka.Text = "Bravo!";
}
Invalidate();
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
NacrtajPalacinke(pictureBox1, LevaLista, e);
}
private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
NacrtajPalacinke(pictureBox2, DesnaLista, e);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
pictureBox1.Invalidate();
pictureBox2.Invalidate();
}
}
}
Вешала¶
Користићемо следеће контроле:
Дугме btnNovaIgra, којим се покреће нова игра;
Текстуално поље txtPojam, у коме први играч задаје реч;
Дугме btnKrajUnosa, којим први играч саопштава програму да је завршио задавање речи;
Лабела lblPolupogodjeno садржи део речи који је други играч погодио;
Лабела lblPromasaji, која садржи неуспеле покушаје другог играча да погоди слова задате речи;
Лабела lblPromasajiTekst садржи реч „Promašaji”;
Лабела lblUputstvo, у којој се појављује текст, који појашњава играчима шта треба да раде. Овај текст се мења у току рада програма, могуће вредности су „Pogađač neka ne gleda, zadavač neka unese pojam” (упутство првом играчу на почетку нове игре), „Pogađajte pojam” (упутство другом играчу), „😀” (када други играч погоди реч), и „🙁” (када други играч не успе да погоди реч).
Пошто није могуће мењати појединачна слова стринга, да би програм био једноставнији и ефикаснији, за полупогођен појам и списак слова-промашаја уместо стрингова користимо низове карактера (char[] PolupogodjenPojam; char[] Promasaji;), па их након сваког ажурирања конвертујемо у стрингове ради приказивања.
У објашњавање самог кода се нећемо упуштати, верујемо да ћете и самостално успети да разумете све детаље.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Vesala
{
public partial class Form1 : Form
{
const int UKUPNO_POKUSAJA = 6;
char[] PolupogodjenPojam;
char[] Promasaji;
bool PogadjanjeJeUToku = false;
int PreostaloPokusaja;
public Form1()
{
InitializeComponent();
ClientSize = new Size(600, 250);
Text = "Vešala";
BackColor = Color.FromArgb(23, 187, 156);
NovaIgra();
}
private void NovaIgra()
{
txtPojam.Visible = true;
btnKrajUnosa.Visible = true;
btnNovaIgra.Visible = false;
lblPromasajiTekst.Visible = false;
lblPromasaji.Visible = false;
lblPolupogodjeno.Visible = false;
lblUputstvo.Text = "Pogađač neka ne gleda, zadavač neka unese pojam";
txtPojam.Text = "";
PreostaloPokusaja = UKUPNO_POKUSAJA;
PogadjanjeJeUToku = false;
txtPojam.Focus();
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!PogadjanjeJeUToku)
return;
char pokusaj = Char.ToUpper(e.KeyChar);
foreach (var stariPromasaj in Promasaji)
if (pokusaj == stariPromasaj)
return; // ovo slovo je vec pokusano
bool nadjeno = false;
for (int i = 0; i < txtPojam.Text.Length; i++)
if (txtPojam.Text[i] == pokusaj)
{
PolupogodjenPojam[i] = pokusaj;
nadjeno = true;
}
if (nadjeno)
{
lblPolupogodjeno.Text = new string(PolupogodjenPojam);
if (lblPolupogodjeno.Text == txtPojam.Text)
{
PogadjanjeJeUToku = false;
lblUputstvo.Text = "😀"; // uspesan kraj
}
}
else
{
Promasaji[UKUPNO_POKUSAJA - PreostaloPokusaja] = pokusaj;
PreostaloPokusaja--; // pogadjac gubi jedan zivot
lblPromasaji.Text = new string(Promasaji);
if (PreostaloPokusaja == 0)
{
PogadjanjeJeUToku = false;
lblUputstvo.Text = "🙁"; // Neuspesan kraj
}
}
}
private void btnNovaIgra_Click(object sender, EventArgs e)
{
NovaIgra();
}
private void btnKrajUnosa_Click(object sender, EventArgs e)
{
txtPojam.Visible = false;
btnKrajUnosa.Visible = false;
btnNovaIgra.Visible = true;
lblPromasajiTekst.Visible = true;
lblPromasaji.Visible = true;
lblPolupogodjeno.Visible = true;
lblUputstvo.Text = "Pogađajte pojam";
lblPromasaji.Text = new string('.', UKUPNO_POKUSAJA);
Promasaji = lblPromasaji.Text.ToCharArray();
txtPojam.Text = txtPojam.Text.ToUpper();
PolupogodjenPojam = new char[txtPojam.Text.Length];
for (int i = 0; i < txtPojam.Text.Length; i++)
PolupogodjenPojam[i] = txtPojam.Text[i] == ' ' ? ' ' : '-';
lblPolupogodjeno.Text = new string(PolupogodjenPojam);
PogadjanjeJeUToku = true;
}
}
}
Овим смо завршили наше путовање кроз Приручник. Надамо се да сте нешто научили, да вам је било занимљиво и да имате гомилу идеја за програме и жељу да те програме напишете. Још једном вам желимо забавно и успешно програмирање!